package com.lagou.QuestionsSystem;

import com.lagou.model.Question;
import com.lagou.server.ServerDao;
import com.lagou.server.ServerInitClose;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 编程实现服务器考试系统
 */
public class QuestionsSys {

    /**
     * 使用合成复用原则
     */
    private ServerInitClose sic;
    private ServerDao sd;

    /**
     * 通过构造方法实现成员变量的初始化
     * @param sic
     */
    public QuestionsSys(ServerInitClose sic, ServerDao sd){
        this.sic = sic;
        this.sd = sd;
    }


    /**
     * 编程实现考试系统的主功能
     * @throws IOException
     */
    public void questionsSystem() throws IOException {

        //声明一个集合用于记录用户每次考试的成绩
        List<Integer> score = new ArrayList<>();

        while (true) {
            //获取客户端发送的信息
            String s = sic.getBr().readLine();
            //判断信息内容调用相应方法
            if ("beginExam".equals(s)) {
                System.out.println("\n接收到开始考试请求,请求数据为 " + s);
                //调用选题方法，得到的返回值为试题
                ArrayList<Question> exam = sd.finalexam();
                //声明一个数组用于记录本次试题答案
                String[] right = new String[exam.size()];
                //声明一个int变量用于答对题数
                int rightSum = 0;
                //将试题答案放入数组中
                for (int i = 0; i < right.length; ++i) {
                    right[i] = exam.get(i).getAnswer();
                }
                //发送试题
                System.out.println("考试开始，请认真作答");
                sic.getOos().writeObject(exam);
                System.out.println("开始答题");
                //接收答案
                //接收到与数组长度相同个数的答案后结束循环
                for (String s1 : right) {
                    String answer = sic.getBr().readLine();
                    //判断答案是否相同
                    if (s1.equalsIgnoreCase(answer)) {
                        rightSum++;
                    }
                }
                //将答对题数转换成分数并记录到集合中
                score.add((rightSum * 20));
                System.out.println("\n考试完毕");
            } else if ("showScore".equals(s)) {
                System.out.println("\n接收到查询成绩请求,请求数据为 " + s);
                List sumScore = new ArrayList(score);
                //判断考试次数,如为0则不发送，如不为0则发送所有成绩
                if (sumScore.size() == 0) {
                    System.out.println("\n无考试成绩，请考试后再查询");
                }
                sic.getOos().writeObject(sumScore);
                sic.getOos().flush();
                System.out.println("\n成绩发送成功");
            } else if("exit".equals(s)){
                System.out.println("\n接收到退出考试系统请求,请求数据为 " + s);
                break;
            }
        }
    }
}
